// 操作数据库模块 扫地僧 2019年5月30日19:58:46
const mysql = require('mysql');
// 连接池
const pool = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : '123456',
    port     : '3306',
    database : 'xunke'
});

// select 返回一个数组里头包含了多个对象
// update delete insert返回一个对象，里头包含有affectRow（受影响行）等信息

/**
 * 增删改查 通用组件  同步写法
 *
 * @param sql 增删改查sql 含占位符
 * @param params 跟占位符顺序匹配的参数数组，要求跟sql的占位符数量一样多
 */
let exec = function (sql,params) {
    // 返回一个 Promise 如果异步转同步不进行.then和.catch，那么就会出现如下情况：
    // 1 代码执行有返回值
    // 2 代码执行不正常也有返回值
    // 因此需要对错误做处理：直接将错误抛出去
    return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
            if (err) {
                reject(err)
            } else {
                connection.query(sql, params, (err, results) => {

                    if (err) {
                        reject(err)
                    } else {
                        console.log(`result : ${JSON.stringify(results)}`);
                        resolve(results)
                        // console.log(data)
                    }
                    // 结束会话
                    connection.release()
                })
            }
        })
    }).then(data=>data)//(data)=>{return data}
        .catch(e=>{throw e})
}
// let a = (data)=>{return data++}
// // 第一层变化：当一个函数体的内部代码只有一行的时候，那么return可省
// let a = (data) => {data++}
// // 第二层变化：当一个函数的返回值只有一个的时候，大括号可省
// let a = (data) => data++
// // 第三层变化：当一个箭头函数的入参有且仅有一个的时候，参数的小括号可省
// let a  = data => data++
//
// if (true) {
//     console.log(1)
// }
// // 代码块只有一行的时候，大括号可省
// if (true)
//     console.log(1)// if条件满足才会执行
//     console.log(2)// 不管if会不会满足都会执行

/**
 * 将所有的参数格式化成数组 参数是可变参数（可变参数在函数声明的时候不写）
 * @returns {Array}
 */
let formatParams = function () {
    var array = [];

    //js中有个变量arguments,可以访问所有传入的值
    for(var i = 0, l = arguments.length; i < l; i++){
        array.push(arguments[i]);
    }
    return array;
}
module.exports = {exec, formatParams};


// ？称为占位符，表示这个位置要填充一个参数
// let mySql = 'insert into student (id, name,age,sex,info) values (?, ?,?,?,?)'
// // let mySql = 'select id, name from student where sex1 = ?'
// // 参数是一个数组，必须按照占位符对应的参数的顺序
// let myParams = ['11', '八九不离十',1,1,'111']
// let a = async () =>{
//     try {
//         let result = await exec(mySql, formatParams('11','name',1,1,'1111'))
//         console.log('执行成功了')
//     } catch (e) {
//         console.log('执行异常：')
//         console.log(e.userMessage)
//     }
// }
// a()

// let a = ()=>{
//     return new Promise((resolve, reject) => {
//         reject(new Error('异步里头的错误'))
//     }).catch(e=>{throw e})
// }
//
// let b = async ()=>{
//     try {
//         await a()
//     } catch (e) {
//         console.log('我在b方法里头拿到了错误：' + e.userMessage)
//     }
// }
//
// b()

